/**
 * 如果数组声明时未设置类型，则会被认为是 any 类型，在初始化时根据第一个元素的类型来推断数组的类型。
 */
var sites: string[];
sites = ["Google", "Runoob", "Taobao"];
console.log(sites[0]);
console.log(sites[1]);
//声明时直接初始化：
var nums: number[] = [1, 2, 3, 4];
console.log(nums[0]);
console.log(nums[1]);
console.log(nums[2]);
console.log(nums[3]);

//Array对象去创建
var arr_names: number[] = new Array(4); //创建一个固定长度的数字数组
for (var i = 0; i < arr_names.length; i++) {
  arr_names[i] = i * 2;
}
console.log(arr_names);

//直接初始化
var sites: string[] = new Array("Google", "Runoob", "Taobao", "Facebook");
for (var i = 0; i < sites.length; i++) {
  console.log(sites[i]);
}
console.log(sites);

/**
 * 数组解构
 * 按照位置解构 位置就是索引就是key
 */
var arr: number[] = [12, 13];
var [x11, y1] = arr; // 将数组的两个元素赋值给变量 x 和 y
console.log(x11);
console.log(y1);

/**
 * 数组迭代
 * 之所以for in 可以迭代数组是因为数组是特殊的对象
 */ var j: any;
var nums: number[] = [1001, 1002, 1003, 1004];
for (j in nums) {
  console.log(nums[j]);
}

/**
 * 多维数组
 * 一个数组的元素可以是另外一个数组，这样就构成了多维数组（Multi-dimensional Array）。
 * 最简单的多维数组是二维数组，定义方式如下：
 */
var multi: number[][] = [
  [1, 2, 3],
  [23, 24, 25],
];
console.log(multi[0][0]);

/**
 * 在函数中的作用
 */

//作为参数
var sites: string[] = new Array("Google", "Runoob", "Taobao", "Facebook");
function disp(arr_sites: string[]) {
  //牢记函数内参数值传递准则：一扇门可以配多把钥匙 但是一把钥匙只能开一扇门
  for (var i = 0; i < arr_sites.length; i++) {
    console.log(arr_sites[i]);
  }
}
disp(sites);

//作为返回值
function disp(): string[] {
  return new Array("Google", "Runoob", "Taobao", "Facebook");
}

/**
 * 数组的一些常用API
 */

/**
 * concat()
 * 连接两个或更多的数组，并返回结果。
 * 注意有返回值,不是改变原数组
 */
var alpha: any[] = ["a", "b", "c"];
var numeric: any[] = [1, 2, 3];
var alphaNumeric = alpha.concat(numeric);
console.log("alphaNumeric : " + alphaNumeric); // a,b,c,1,2,3

/**
 * pop()
 * 删除数组的最后一个元素并 返回 删除的元素。
 */
var numbers = [1, 4, 9]; //自动推断为number类型
var element = numbers.pop();
console.log("被删除的是 : " + element); // 9
var element = numbers.pop();
console.log("element is : " + element); // 4

/**
 * push()
 * 向数组的末尾添加一个或更多元素，并 返回 新的长度。
 */ var numbers = new Array(1, 4, 9);
var length = numbers.push(10);
console.log(length);
console.log("*********");

/**
 * reduce()
 * 返回循环结束后最后的逻辑值
 * 如果不传入初始值则loop从第一位开始(相当于比传值提前走了一步)
 */
var total = [0, 1, 2, 3].reduce(function (loop, v) {
  console.log(loop, v);
  return loop + v;
}, 20);
console.log("total is : " + total); // 6

/**
 * reduceRight()
 * 返回循环结束后最后的逻辑值（从右到左）。
 * 如果不传入初始值则loop从最后一位开始(相当于比传值提前走了一步)
 *
 * 可以将数组revers之后也可达到类似的效果
 */
var total = [0, 1, 2, 3].reduceRight(function (a, b) {
  console.log(a, b);
  return a + b;
});
console.log("total is : " + total); // 6

/**
 * reverse()
 * 反转数组的元素顺序。无返回值 void
 */
var arr = [0, 1, 2, 3].reverse();
//console.log([2, 1] + [6, 2]); 虽然在ts里不过审但他还是一道面试题0.0
console.log(arr.toLocaleString());
console.log("Reversed array is : " + arr); // 3,2,1,0  会触发arr的tostring

/**
 * shift()
 * 删除并 返回 数组的第一个元素。
 */
var arr3 = [10, 1, 2, 3];
var rs = arr3.shift();
console.log(arr3, rs); // 10

/**
 * unshift()
 * 向数组的开头添加一个或更多元素，并返回新的长度
 */
var arr4 = new Array("orange", "mango", "banana", "sugar");
var length = arr4.unshift("water");
console.log(length,arr4)
